package pe.com.pgn.consolidadorventas.servidorestacion.dao.impl;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import pe.com.pgn.consolidadorventas.servidorestacion.dao.VentaCombustibleDao;
import pe.com.pgn.consolidadorventas.servidorestacion.util.ArchivosUtil;
import pe.com.pgn.consolidadorventas.servidorestacion.util.Base64Util;
import pe.com.pgn.consolidadorventas.servidorestacion.util.Constantes;
import pe.com.pgn.consolidadorventas.servidorestacion.util.ExeUtil;
import pe.com.pgn.consolidadorventas.servidorestacion.util.LoggerUtil;
import pe.com.pgn.consolidadorventas.servidorestacion.util.XMLUtil;

@Repository(value="ventaGnvDaoImpl")
public class VentaGnvDaoImpl implements VentaCombustibleDao {

	static Logger logger = Logger.getLogger(VentaGnvDaoImpl.class);

	@Autowired
	@Qualifier("constantes")
	Constantes constantes;
	
	String formatoFechaCompleta;
	SimpleDateFormat formatFecha;
	
	public VentaGnvDaoImpl(){
		formatoFechaCompleta = "[dd-MMM-yyyy]-[HH-mm-ss-SSS]";
		formatFecha = new SimpleDateFormat(formatoFechaCompleta);
	}
	
	@Override
	public String consultarInformacionVentasPorDia(String date) {
		String codificacion = Constantes.COD_ANSI;
		
		String fecha = "";
		Element raiz = null;
		String respuesta = "";
		XMLOutputter formato = null;
		int flagOperacion = 1;
		
		//Parseamos la fecha
		String valoresFecha[]=date.split("\\/");
		try{
			fecha = valoresFecha[2]+valoresFecha[1]+valoresFecha[0];	
		}catch(ArrayIndexOutOfBoundsException e){
			logger.error(e.getMessage());
		}
		
		//POR ERROR DEL PROGRAMA AL REGENERAR EL ERROR ES CON OTRA CODIFICACION
		String nombreArchivoCorrecto = constantes.getPrefijoGnv()+fecha+".txt";
		String carpetaArchivoCorrecto = constantes.getCarpetaGnv();
		String rutaArchivoCorrecto = carpetaArchivoCorrecto + nombreArchivoCorrecto;
		String rutaArchivoError = constantes.getCarpetaGnv()+constantes.getPrefijoGnv()+fecha+"_err.txt";
		
		LoggerUtil.info(logger,"=====================================");
		LoggerUtil.info(logger,"Inicio llamada GNV");
		if(constantes.getUsarExeGnv() == 1){
			LoggerUtil.info(logger,"Inicio exe Gnv");
			ExeUtil.ejecutarPrograma(constantes.getRutaExeGnv()+" "+date,constantes.getTimeoutExeGnv());
			LoggerUtil.info(logger,"Fin exe Gnv");
		}
		
		//Eliminamos las barras y pasamos el formato de fecha
		List<String> lineas = null;
		
		//Cargamos el archivo
		boolean existeArchivoCorrecto = ArchivosUtil.verificarExistenciaArchivo(rutaArchivoCorrecto);
		
		if(existeArchivoCorrecto == false){
			//No se encontro el archivo , cargamos el correspondiente archivo de error
			flagOperacion = 0;
			
			lineas = ArchivosUtil.cargarArchivo(rutaArchivoError,codificacion); 
			
			if(lineas == null){
				//No se encontro tampoco el archivo de error , ponemos el flag a -1
				flagOperacion = -1;
			}
		}
		
		raiz = XMLUtil.crearNodoXml("ventasGnv");
		raiz.setAttribute("dia",fecha);
		raiz.setAttribute("codEstacion",constantes.getPrefijoGnv());
		
		if(constantes.getFormatearXml() == 1){
			//XML tabulado
			formato = new XMLOutputter(Format.getPrettyFormat());
		}else{
			//XML sin tabular
			formato = new XMLOutputter();
		}
		
		if(flagOperacion == -1){
			XMLUtil.crearElementoHijo(raiz,"mensajeError",Constantes.ERROR_ESTANDAR);
		}else{
			//Archivo de error
			if(flagOperacion==0){
				String rpta = ""; 
				if(lineas.size()>0){
					rpta = lineas.get(0);
				}else{
					rpta = Constantes.ERROR_ESTANDAR;
				}	
				XMLUtil.crearElementoHijo(raiz,"mensajeError",rpta);
			}else{
				Calendar cx = Calendar.getInstance();
				Date d = cx.getTime();
				String fechaFichero = formatFecha.format(d);
				String zipSalida = constantes.getRutaTemporal()+"GNV"+constantes.getPrefijoGnv()+fechaFichero+".zip";
				ArchivosUtil.comprimirArchivo(carpetaArchivoCorrecto,nombreArchivoCorrecto,zipSalida);
				if(ArchivosUtil.verificarExistenciaArchivo(zipSalida)){
					byte[] buffer = ArchivosUtil.cargarArchivoBinario(zipSalida);
					String hash = Base64Util.convertirBytesStringBase64(buffer);
					XMLUtil.crearElementoHijo(raiz,"contenido",hash);
					if(!ArchivosUtil.borrarArchivo(zipSalida)){
						LoggerUtil.error(logger,"No se pudo eliminar el archivo :"+zipSalida);
					}
				}else{
					flagOperacion = 0;
					XMLUtil.crearElementoHijo(raiz,"mensajeError","No se pudo crear el archivo zip para enviar");
				}
			}	
		}
		
		LoggerUtil.info(logger,"Fin llamada GNV");
		LoggerUtil.info(logger,"=====================================");
		
		raiz.setAttribute("tipoRespuesta",String.valueOf(flagOperacion));
		
		respuesta = formato.outputString(raiz);
		return respuesta;
	}

}
